perm filename WALDRV.SAI[SYS,HE] blob sn#054277 filedate 1973-07-30 generic text, type T, neo UTF8
00100	
00200	
00300	
00400	BEGIN "WALDRV"
00500	
00600	COMMENT   This is the driver program for WALEYE;
00700	
00800	
00900	REQUIRE "{ } { }" DELIMITERS;
01000	
01100	DEFINE INTEGER_ARRAY="INTEGER ARRAY";
01200	DEFINE BUF_LIMIT="200";
01300	SHORT REAL SCAL;
01400	
01500	REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
01600	REQUIRE "HELIB[1,3]" LIBRARY;
01700	REQUIRE "SAITRG[SYS,BGB]" SOURCE_FILE;
01800	REQUIRE "DPY2.HDR[VIS,WAP]" SOURCE_FILE;
01900	
02000	
02100	EXTERNAL PROCEDURE TVIN;
02200	
02300	EXTERNAL INTEGER FLINE,LLINE,LSIDE,RSIDE,TVCAM,TCLIP,BCLIP;
02400	EXTERNAL INTEGER TVWORD;
02500	EXTERNAL INTEGER PROCEDURE GIOWD(INTEGER ARRAY BUF);
02600	
02700	
02800	
02900	DEFINE ⊃ = {COMMENT}, CRLF={'15&'12}, ACRLF={&'15&'12};
03000	DEFINE SINDIR={12}, COSDIR={13}, SINTHETA={9}, COSTHETA={10};
03100	DEFINE PI1={3.1415927}, PIO2={1.570796}, PI6={.523595};
03200	DEFINE PRINT(FOO) = {OUTSTR("  FOO="&CVG(FOO)ACRLF); };
03300	
03400	
03500	
03600	
03700	PROCEDURE CORNFIT;
03800	BEGIN "CORNFIT"
03900		SHORT INTEGER X_WIDTH, Y_WIDTH;
04000	
04100	
04200	
04300	SIMPLE PROCEDURE BOUNDARY(SHORT REAL X1,Y1,X2,Y2);
04400	BEGIN
04500		X1 ← TX(X1);
04600		Y1 ← TY(Y1);
04700		X2 ← TX(X2);
04800		Y2 ← TY(Y2);
04900		AIVECT(X1,Y1);
05000		AVECT(X1,Y2);
05100		AVECT(X2,Y2);
05200		AVECT(X2,Y1);
05300		AVECT(X1,Y1);
05400	END;
05500	
05600	
05700	SIMPLE PROCEDURE ARROW(REAL X,Y,DX,DY);
05800	BEGIN
05900	REAL FACTOR,X1,X2,Y1,Y2;
06000		FACTOR←1.5;
06100		DX←DX*FACTOR;
06200		DY←DY*FACTOR;
06300		X1 ← TX(X-DX);
06400		X2 ← TX(X+DX);
06500		Y2 ← TY(Y+DY);
06600		Y1 ← TY(Y-DY);
06700		AIVECT(X1,Y1);
06800		AVECT(X2,Y2);
06900		X1← TX(X+DX/2.-DY/2.);
07000		Y1← TY(Y+DY/2.+DX/2.);
07100		AIVECT(X1,Y1);
07200		AVECT(X2,Y2);
07300		Y1← TY(Y+DY/2.-DX/2.);
07400		X1← TX(X+DX/2.+DY/2.);
07500		AVECT(X1,Y1);
07600	END;
07700	
07800	
07900	
08000	SIMPLE PROCEDURE LINE_MOD(SHORT REAL CX,CY; REFERENCE SHORT REAL
08100		THETA,COSTH,SINTH);
08200	⊃ This procedure takes the direction cosines CX, CY and
08300		calculates the appropriate angle theta;
08400	
08500	BEGIN
08600		SHORT REAL PHI;
08700			IF ABS(CX) ≥.10@-8  THEN
08800			BEGIN 
08900				PHI ← ATAN(CY/CX);
09000				IF CX<0 THEN PHI←PHI+PI1;
09100			END  ELSE
09200			IF CY≥0 THEN PHI ← PIO2 ELSE PHI ← -PIO2;
09300			THETA ← PHI +PI1;		
09400			COSTH←COS(THETA);
09500			SINTH←SIN(THETA);
09600	IF DEB_EYE THEN  OUTSTR(CRLF&"PHI = " &CVG(PHI)
09700		           &"THETA = " &CVG(THETA)
09800	    		   &"  SINTH="&CVG(SINTH)
09900	    		   &"  COSTH="&CVG(COSTH)&CRLF);
10000	END;
10100	
     

00100	
00200	
00300	PROCEDURE DISP_MODEL(SHORT INTEGER N,DIREC; SHORT REAL XCM,YCM;
00400				SHORT REAL ARRAY CORNMOD);
00500	
00600	⊃ Here we calculate and display the model of a line or corner;
00700	
00800		BEGIN "MOD"
00900	
01000	
01100	SIMPLE REAL PROCEDURE SMALLER(REAL L1,L2);
01200	IF L1<L2 THEN RETURN(L1) ELSE RETURN(L2);
01300	
01400		SHORT REAL XC,YC, DX,DY,DPX,DPY,TXC,TYC,
01500			DX3,DY3, L,LO2;
01600		LABEL AFTER;
01700		⊃ DISPLAY MODEL OF LINE OR CORNER;
01800			⊃ OUTSTR(" DIREC="&CVS(DIREC)ACRLF);
01900			L←SMALLER(15.,SQRT(X_WIDTH*Y_WIDTH)/2.);
02000			LO2←L/2.;
02100			DPX←CORNMOD[1,COSTHETA]; DPY←CORNMOD[1,SINTHETA];
02200			DY←CORNMOD[1,COSDIR];  DX←CORNMOD[1,SINDIR];
02300			XC←XCM-LO2*DX; YC←YCM-LO2*DY;
02400			IF N=1 THEN 
02500			BEGIN
02600				AIVECT(TX(XC),TY(YC));
02700				AVECT(TX(XCM+LO2*DX),TY(YCM+LO2*DY));
02800				XC←XCM;  YC←YCM;
02900			END ELSE
03000			BEGIN
03100				TXC←TX(XCM);  TYC←TY(YCM);
03200				AIVECT(TX(XCM-L*DX),TY(YCM-L*DY));
03300				AVECT(TXC,TYC);
03400			END;
03500			ARROW(XC,YC,DPX,DPY);
03600			IF DIREC=0 THEN ARROW(XC,YC,-DPX,-DPY);
03700			IF N=1 THEN GO TO AFTER;
03800		⊃	IF ABS(DPY)>0.5 THEN ARROW(XC,YC-3,DX,DY)    
03900			ELSE ARROW(XC-3,YC,DX,DY);
04000			IF N=2 THEN 
04100			BEGIN 
04200				AIVECT(TXC,TYC);
04300				DX←CORNMOD[2,SINDIR]; DY←CORNMOD[2,COSDIR];
04400				DPX←CORNMOD[2,COSTHETA];
04500				DPY←CORNMOD[2,SINTHETA];
04600				XC←XCM-LO2*DX; YC←YCM-LO2*DY;
04700				AVECT(TX(XCM-L*DX),TY(YCM-L*DY));
04800				ARROW(XC,YC,DPX,DPY);
04900				IF DIREC=0 THEN ARROW(XC,YC,-DPX,-DPY);
05000		⊃		IF ABS(DPY)>0.5 THEN 
05100				ARROW(XC,YC-3,DX,DY)
05200				ELSE ARROW(XC-3,YC,DX,DY);
05300				GO TO AFTER;
05400			END;
05500			DX←CORNMOD[2,SINDIR]; DY←CORNMOD[2,COSDIR];
05600			AIVECT(TX(XCM-L*DX),TY(YCM-L*DY));
05700			AVECT(TXC,TYC);
05800			DX3←CORNMOD[3,SINDIR]; DY3←CORNMOD[3,COSDIR];
05900			AVECT(TX(XCM-L*DX3),TY(YCM-L*DY3));
06000			DPX←CORNMOD[2,COSTHETA]; DPY←CORNMOD[2,SINTHETA];
06100	   		XC←XCM-LO2*DX; YC←YCM-LO2*DY;
06200		⊃	IF ABS(DPY)>0.5 THEN ARROW(XC,YC-3,DX,DY)
06300			ELSE ARROW(XC-3,YC,DX,DY);
06400			DPX←CORNMOD[3,COSTHETA]; DPY←CORNMOD[3,SINTHETA];
06500			XC←XCM-LO2*DX3; YC←YCM-LO2*DY3;
06600			ARROW(XC,YC,DPX,DPY);
06700			IF DIREC=0 THEN ARROW(XC,YC,-DPX,-DPY);
06800		⊃	IF ABS(DPY)>0.5 THEN ARROW(XC,YC-3,DX3,DY3)
06900			ELSE ARROW(XC-3,YC,DX3,DY3);
07000	AFTER:		DPYBIG(3);
07100			AIVECT(-300,420);
07200			DPYSST("MODEL OF CORNER");
07300			AIVECT(-500,380);
07400	DPYSST("ARROWS(PERPENDICULAR TO LINES) POINT FROM LIGHT TO DARK");
07500			DPYOUT(1);
07600		END "MOD";
07700	
     

00100	
00200	
00300	DEFINE XTIME(FOO)={XCEN+10.*SIN(PI6*(FOO))};
00400	DEFINE YTIME(FOO)={YCEN-10.*COS(PI6*(FOO))};
00500	SHORT INTEGER I, BKGR, DIREC, SIGD, SEARCH,J,MODLINES;
00600	SHORT INTEGER DUMMY,MESS,CAMNUM,SIZE,NCORNERS;
00700	INTEGER TIME;
00800	SHORT REAL XIB,YIB,XIC,YIC,XID,YID,XIE,YIE,XIBB,YIBB;
00900	SHORT REAL XCEN,YCEN,X1,Y1,X2,Y2;
01000	SHORT REAL TOLER,CX,CY,CX1,CY1,XX1,YY1,XX2,YY2,TIME1,TIME2,TIME3;
01100	STRING INSTRING,TYPE_CORN;
01200	SHORT REAL ARRAY CORNMOD[1:3,8:13];
01300	    LABEL LOP,LOOP,LOOP1,LOOP2,PAR,PARMS,SETSIG,WIN;
01400		COMMENT LABELS MUST BE DECLARED BEFORE USE -- IN FACT, THEY HAVE 
01500		    TO BE DECLARED WITHIN THE INNER-MOST BLOCK IN WHICH THE 
01600		    STATEMENT BEING LABELED APPEARS. (SEE SAIL 3.4);
01700	
01800	
01900	
02000	SIMPLE INTEGER PROCEDURE LARGER(SHORT INTEGER L1,L2);
02100	IF L1>L2 THEN RETURN(L1) ELSE RETURN(L2);
02200	
02300	
02400	    ⊃ Main Program;
02500		X_WIDTH←40; Y_WIDTH←30;
02600		PUT_DATA(0,0,"DRV");
02700		COMMENT THIS INFORMS THE MESSAGE PROCEDURE HANDLER THAT YOUR
02800		    LOGICAL NAME (IE. YOUR ADDRESS FOR MESSAGES) IS "DRV"
02900		    (SEE HAND/EYE HACKERS PART II 2.2);
03000	
03100	    OUTSTR("TRYEYE WAITING"ACRLF);
03200		COMMENT THIS PRINTS A NOTE SAYING THAT YOU'VE GOTTON THIS FAR;
03300	   WHILE (¬YES_CAM)∨(¬YES_EYE) DO CALL(1,"SLEEP");
03400		COMMENT YES_CAM IS A GLOBAL VARIABLE WHICH IS SET TO TRUE AS 
03500		    SOON AS THE CAMERA PROGRAM IS RUNNING AND READY TO ACCEPT
03600		    MESSAGES.  YES_EYE IS SIMILAR EXCEPT IT IS SET BY GILEYE.
03700		    `CALL(1,"SLEEP")' IS A CALL USING A CONSTRUCTION IN SAIL
03800		    WHICH ALLOWS A SAIL PROGRAM TO CALL PDP SYSTEM ROUTINES.
03900		    THIS ONE EFFECTIVELY TAKES THIS JOB OUT OF THE RUNQ 
04000		    FOR A SHORT AMOUNT OF TIME (SEE SAIL 12-118,12-119).
04100		    CONSEQUENTLY, THIS STATEMENT HAS THE PROGRAM WAIT (WITHOUT
04200		    TYING UP THE RUNQ) UNTIL BOTH THE CAMERA AND GILEYE JOBS
04300		    ARE READY.;
04400	    OUTSTR("TRYEYE READY"ACRLF);
04500		COMMENT THIS SIMPLY OUTPUTS A NOTE SAYING THAT EVERYTHING IS READY;
04600	    TRACING ← 1;
04700		COMMENT THIS TURNS ON THE TRACING OF MESSAGES, ETC.;
04800	    
04900	LOP: OUTSTR(" WHICH CAMERA ARE YOU GOING TO USE?
05000	 	1 FOR COHU ---  2 FOR SIERRA    "ACRLF);
05100		CAMNUM←CVD(INCHWL);
05200		OUTSTR("CAMERA NUMBER="& CVS(CAMNUM)ACRLF);
05300		IF CAMNUM≠1∧CAMNUM≠2 THEN GO TO LOP;
05400		LOOK_AT[1]←CAMNUM;
05500	
05600	
05700	⊃   MESS ← ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE(CAMNUM));
05800		COMMENT THIS ASKS THE CAMERA JOB TO RUN ITS ROUTINE 
05900		    CAM_UPDATE (SEE PREAMB.TXT SECT 3).  CAM_UPDATE READS
06000		    THE POTS ON THE CAMERA AND INITIALIZES THE GLOBAL ARRAY
06100		    CAMERA_MODEL (SEE PREAMB.TXT UNDER MODELS, ALSO SEE
06200		    HAND/EYE UTILITY ROUTINES UNDER CAMCHG) TO INDICATE
06300		    THE CURRENT POSITION.  THIS ROUTINE MUST (YES, MUST)
06400		    BE EXECUTED BEFORE ASKING THE CAMERA TO MOVE (AS IN
06500		    THE NEXT STATEMENT).  THE 7 IN THE ISSUE COMMAND IS A CODE
06600		    INDICATING THAT THE MESSAGE SHOULD BE HANDLED "NORMALLY".
06700		    THIS MEANS THAT THE "DRV" PROGRAM WILL WAIT UNTIL THE
06800		    "CAM" PROGRAM INDICATES THAT IT HAS FINISHED.  IT
06900		    ALSO MEANS THE MESSAGE WILL BE DESTROYED AFTER IT HAS
07000		    BEEN ACTED UPON AND ACKNOWLEDGED (SEE HAND/EYE HACKERS 
07100		    PART II 4.0)
07200	
07300		    ISSUE ACTS LIKE A FUNCTION IN THAT IT RETURNS A VALUE
07400		    (THE INTERNAL NUMBER FOR THE MESSAGE).  SOMETIMES THIS 
07500		    NUMBER CAN BE USED TO OBTAIN MORE INFORMATION ABOUT THE
07600		    MESSAGE (SEE HAND/EYE HACKERS PART II).  HOWEVER, IN THIS
07700		    SIMPLE EXAMPLE, IT IS NEVER USED.  HENCE, THE VARIABLE,
07800		    MESS, IS A DUMMY RECEIVING FIELD.;
07900	
08000	LOOP:         OUTSTR("TYPE A <CR>
08100		 WHEN YOU ARE SATISFIED WITH THE CAMERA POSITION"ACRLF);
08200		INCHWL;
08300		COMMENT  THIS STATEMENT CAUSES THE PROGRAM TO PAUSE FOR A
08400		    RESPONSE FROM THE CONSOLE.  THIS PAUSE ALLOWS YOU TIME TO AIM 
08500		    AND FOCUS THE CAMERA YOURSELF IF YOU WANT TO (SEE THE BRIEF
08600		    DISCUSSION ON OPERATING THE CAMERA UNDER "INSTRUCTIONS TO
08700		    RUN THIS PROGRAM"  INSTRUCTION NUMBER III).  WHEN YOU ARE
08800		    FINISHED, TYPE ANYTHING (EVEN NOTHING) FOLLOWED BY A 
08900		    CARRIAGE-RETURN).;
09000	
09100	⊃   MESS ← ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE(CAMNUM));
09200		COMMENT  THIS UPDATES THE GLOBAL CAMERA_MODEL IN CASE YOU 
09300		    CHANGED THE CAMERA POSITION.  THE CAMERA_MODEL ARRAY IS 
09400		    NOT AUTOMATICALLY UPDATED IF YOU MOVE THE CAMERA AROUND
09500		    MANUALLY.;
09600	
09700	    DIS_EYE←TRUE; DEB_EYE←FALSE;
09800	⊃	OUTSTR(" ARE YOU DEBUGGING AND WANT ALL POSSIBLE OUTPUT?  
09900			Y  OR  N?  "ACRLF);
10000	⊃	IF INCHWL="Y" THEN DEB_EYE←TRUE;
10100	
10200	⊃	OUTSTR("DO YOU WANT CALCOMP PLOTS? Y OR N?"ACRLF);
10300	⊃	IF INCHWL="Y" THEN EYEFLG←-1 ELSE EYEFLG←0;
10400		EYEFLG←0;
10500	
10600	
10700	WIN:	OUTSTR(" THE STANDARD OR PRESENT WINDOW SIZE IS:
10800		WIDTH="&CVS(X_WIDTH)&"  HEIGHT="&CVS(Y_WIDTH)&
10900		"  DO YOU WANT TO CHANGE IT?   Y OR N?  "ACRLF);
11000		IF INCHWL="Y" THEN 
11100		BEGIN
11200			OUTSTR(" WIDTH AND HEIGHT 
11300			EACH FOLLOWED BY A CARRIAGE-RETURN "ACRLF);
11400			X_WIDTH←CVD(INCHWL);
11500			Y_WIDTH←CVD(INCHWL);
11600			GO TO WIN;
11700		END;
11800	
11900	
12000	LOOP1:	OUTSTR(" ARE YOU LOOKING FOR A LINE,SIMPLE CORNER(2 SIDES),
12100		OR PHYSICAL CORNER(3 SIDES)?  [TYPE L,C, OR P] "ACRLF);
12200	
12300		MODLINES←0;
12400		TYPE_CORN←INCHWL;
12500		IF TYPE_CORN="L" THEN
12600		BEGIN
12700			MODLINES←1;
12800			OUTSTR(" ONE LINE WITH 3 NUMBERS, THE FIRST TWO 
12900	DESIGNATE THE CENTER OF THE LINE IN SCREEN COORDINATES,
13000	THE THIRD IS THE VALUE OF THE HOUR HAND WHEN IT IS PARALLEL TO THE
13100	LINE WHILE THE FORTH IS ANY HOUR-HAND SETTING ON THE SIDE OF THE 
13200	OBJECT."ACRLF);
13300		END;
13400		IF TYPE_CORN="C" THEN
13500		BEGIN
13600			MODLINES←2;
13700			OUTSTR(" ONE LINE WITH 4 NUMBERS THE FIRST TWO
13800	DESIGNATES THE VERTEX IN SCREEN COORDINATES WHILE THE OTHERS GIVE 
13900	THE ANGLES OF THE LINES IN HOUR-HAND VALUES IN A CLOCKWISE MANNER 
14000			ABOUT THE VERTEX."ACRLF);
14100		END;
14200		IF TYPE_CORN="P" THEN
14300		BEGIN
14400			MODLINES←3;
14500			OUTSTR(" ONE LINE WITH 5 NUMBERS THE FIRST TWO
14600	DESIGNATES THE VERTEX IN SCREEN COORDINATES WHILE THE OTHERS GIVE 
14700	THE ANGLES OF THE LINES IN HOUR-HAND VALUES IN A CLOCKWISE MANNER 
14800			ABOUT THE VERTEX."ACRLF);
14900		END;
15000		IF MODLINES=0 THEN GO TO LOOP1;
15100	
15200	
15300	             INSTRING ← INCHWL;
15400		      XIB ← REALSCAN(INSTRING,DUMMY);
15500		      YIB ← REALSCAN(INSTRING,DUMMY);
15600		      TIME1 ← REALSCAN(INSTRING,DUMMY);
15700		      TIME2 ← REALSCAN(INSTRING,DUMMY);
15800		      TIME3 ← REALSCAN(INSTRING,DUMMY);
15900	
16000	    
16100	PARMS:
16200	
16300	OUTSTR(" ONE LINE WITH 3 WAL PARAMETERS.
16400		FIRST IS INTENSITY:
16500			-1 FOR DARKER OUTSIDE
16600			 0 FOR UNKNOWN
16700			 1 FOR LIGHTER OUTSIDE
16800		SECOND IS SEARCH:
16900			-1 FOR USE WINDOW ONLY
17000			N≥1 FOR SEARCH IN AN AREA OF DIMENSION
17100			     N(INTEGER) ABOUT INITIAL WINDOW
17200		THIRD IS TOLERANCE OF ANGLE MATCH:
17300			USUALLY 0.1 BUT DOWN TO 0.02 WITH CARE.
17400			IF TOLERANCE IS >1 THEN ANY CORNER
17500			WILL BE ACCEPTED."ACRLF);
17600	
17700	
17800		INSTRING←INCHWL;
17900		DIREC←REALSCAN(INSTRING,DUMMY);
18000		  SEARCH←REALSCAN(INSTRING,DUMMY);
18100		TOLER←REALSCAN(INSTRING,DUMMY);
18200	
18300		IF TOLER>1 THEN DIREC←0;
18400	SETSIG: IF DIREC=0 THEN SIGD←1 ELSE SIGD←DIREC;
18500		XCEN←XIB; YCEN←YIB;
18600	
18700		
18800		IF TYPE_CORN="L" THEN
18900		BEGIN
19000			XIBB←XTIME(TIME1+6.);
19100			YIBB←YTIME(TIME1+6.);
19200			XIC←XTIME(TIME1);
19300			YIC←YTIME(TIME1);
19400			YID←YTIME(TIME2);
19500			XID←XTIME(TIME2);
19600			IF XIC*XIC+YIC*YIC≥XIBB*XIBB+YIBB*YIBB THEN
19700			BEGIN
19800				X2←XIC;  X1←XIBB;
19900				Y2←YIC;  Y1←YIBB;
20000			END ELSE
20100			BEGIN
20200				X1←XIC;  X2←XIBB;
20300				Y1←YIC;  Y2←YIBB;
20400			END;
20500			CX1←Y1-Y2; CY1←X2-X1;
20600			XX1←XCEN+CX1; YY1←YCEN+CY1;
20700			XX2←XCEN-CX1; YY2←YCEN-CY1;
20800			IF(XX1-XID)↑2+(YY1-YID)↑2≥(XX2-XID)↑2+(YY2-YID)↑2 THEN
20900			BEGIN CX←CX1; CY←CY1; END
21000			ELSE BEGIN CX←-CX1; CY←-CY1; END;
21100			CX←CX*SIGD; CY←CY*SIGD;
21200	     LINE_MOD(CX,CY,CORNMOD[1,8],CORNMOD[1,COSTHETA],CORNMOD[1,SINTHETA]);
21300			CORNMOD[1,11]←-SIGD;
21400			CORNMOD[1,SINDIR]←CORNMOD[1,11]*CORNMOD[1,SINTHETA];
21500			CORNMOD[1,COSDIR]←-CORNMOD[1,11]*CORNMOD[1,COSTHETA];
21600			GO TO LOOP2;
21700		END;
21800		IF TYPE_CORN="C" THEN 
21900		BEGIN
22000			XIC←XTIME(TIME1);
22100			YIC←YTIME(TIME1);
22200			YID←YTIME(TIME2);
22300			XID←XTIME(TIME2);
22400			CX←(YIC-YIB)*SIGD;
22500			CY←(XIB-XIC)*SIGD;
22600	     LINE_MOD(CX,CY,CORNMOD[1,8],CORNMOD[1,COSTHETA],CORNMOD[1,SINTHETA]);
22700			CX←(YIB-YID)*SIGD;
22800			CY←(XID-XIB)*SIGD;
22900	     LINE_MOD(CX,CY,CORNMOD[2,8],CORNMOD[2,COSTHETA],CORNMOD[2,SINTHETA]);
23000			CORNMOD[1,11]←-SIGD; CORNMOD[2,11]←SIGD;
23100			FOR J←1 STEP 1 UNTIL MODLINES DO
23200			BEGIN
23300			CORNMOD[J,SINDIR]←CORNMOD[J,11]*CORNMOD[J,SINTHETA];
23400			CORNMOD[J,COSDIR]←-CORNMOD[J,11]*CORNMOD[J,COSTHETA];
23500			END;
23600			GO TO LOOP2;
23700		END;
23800		IF TYPE_CORN="P" THEN 
23900		BEGIN
24000			XIC←XTIME(TIME1);
24100			YIC←YTIME(TIME1);
24200			YID←YTIME(TIME2);
24300			XID←XTIME(TIME2);
24400			XIE←XTIME(TIME3);
24500			YIE←YTIME(TIME3);
24600			CX←(YIC-YIB)*SIGD;
24700			CY←(XIB-XIC)*SIGD;
24800	     LINE_MOD(CX,CY,CORNMOD[1,8],CORNMOD[1,COSTHETA],CORNMOD[1,SINTHETA]);
24900			CX←(YIB-YID)*SIGD;
25000			CY←(XID-XIB)*SIGD;
25100	     LINE_MOD(CX,CY,CORNMOD[2,8],CORNMOD[2,COSTHETA],CORNMOD[2,SINTHETA]);
25200			CX←(YIB-YIE)*SIGD;
25300			CY←(XIE-XIB)*SIGD;
25400	     LINE_MOD(CX,CY,CORNMOD[3,8],CORNMOD[3,COSTHETA],CORNMOD[3,SINTHETA]);
25500			CORNMOD[1,11]←-SIGD; CORNMOD[2,11]←CORNMOD[3,11]←SIGD;
25600			FOR J←1 STEP 1 UNTIL MODLINES DO
25700			BEGIN
25800			CORNMOD[J,SINDIR]←CORNMOD[J,11]*CORNMOD[J,SINTHETA];
25900			CORNMOD[J,COSDIR]←-CORNMOD[J,11]*CORNMOD[J,COSTHETA];
26000			END;
26100		END;
26200	
26300	
26400	LOOP2:  IF DEB_EYE THEN INCHWL;
26500	
26600		X1←XCEN-X_WIDTH/2;
26700		X2←XCEN+X_WIDTH/2;
26800		Y2←YCEN+Y_WIDTH/2;
26900		Y1←YCEN-Y_WIDTH/2;
27000			DPYSET(BUF);
27100			INIT_DOMAIN(X1,Y2,X2,Y1);
27200			BOUNDARY(X1,Y2,X2,Y1);
27300			DISP_MODEL(MODLINES,DIREC,XCEN,YCEN,CORNMOD);
27400			IF EYEFLG=-1 THEN CALCOMP("MODEL",BUF);
27500			INCHWL; INCHWL;
27600		OUTSTR(CRLF&"CENTER OF THE WINDOW "&
27700			CVG(XCEN)&"  "& CVG(YCEN) ACRLF);
27800	
27900	    LOOK_AT[2] ← XCEN;
28000	    LOOK_AT[3] ← YCEN;
28100	    LOOK_AT[4] ← X_WIDTH;
28200	    LOOK_AT[5] ← Y_WIDTH;
28300	
28400	
28500		TVCAM←LOOK_AT[1];
28600	         LSIDE←LOOK_AT[2]-(LOOK_AT[4] DIV 2);
28700	         RSIDE←LSIDE+LOOK_AT[4]-1;
28800	         FLINE←LOOK_AT[3]-(LOOK_AT[5] DIV 2);
28900	         LLINE←FLINE+LOOK_AT[5]-1;
29000		SIZE←X_WIDTH*Y_WIDTH DIV 5;
29100		TCLIP←0; BCLIP←7;
29200		BEGIN
29300		INTEGER ARRAY TVBUF[1:SIZE];
29400	
29500			TVWORD←GIOWD(TVBUF);
29600		END;
29700	
29800	
29900		FOR I←1 STEP 1 UNTIL 10 DO TVIN;
30000	
30100	  		OUTSTR(" ARE YOU SATISFIED WITH THE MODEL?
30200			Y OR N? "ACRLF);
30300			INSTRING←INCHWL;
30400			IF INSTRING="N" THEN GO TO LOOP1;
30500	⊃	IF ¬DEB_EYE THEN 
30600		BEGIN
30700			OUTSTR(" DO YOU WANT DISPLAYS?  Y OR N? "ACRLF);
30800	⊃		IF INCHWL="N"  THEN DIS_EYE←0;
30900	⊃	END;
31000	⊃	TIME←CALL(0,"RUNTIM");
31100	⊃	PRINT(TIME);
31200			DPYCLR;
31300		OUTSTR( " DO YOU WANT ALL CORNERS THAT MATCH?  Y OR N?"ACRLF);
31400			IF INCHWL="Y" THEN DIR_EYE[0,1]←-1 ELSE DIR_EYE[0,1]←1;
31500	     ISSUE(7,"DRV","EYE",
31600		MESSAGE	SRCH_IMAGE(MODLINES, DIREC, SEARCH, TOLER, CORNMOD));
31700		COMMENT   THIS IS THE CALL ON THE CORNER-FINDER "WALEYE". NOTICE
31800		    THAT THE FOUR PARAMETERS AND CORNMOD[...] ARE
31900		    PASSED AS ARGUMENTS.;
32000	
32100	⊃	TIME←CALL(0,"RUNTIM");
32200	⊃	PRINT(TIME);
32300		IF EYEFLG≠0∨¬DIS_EYE THEN GO TO PAR;
32400		INCHWL; INCHWL;
32500		DPYSET(BUF);
32600		INIT_DOMAIN(X1,Y2,X2,Y1);
32700	 	BOUNDARY(X1,Y2,X2,Y1);
32800		DISP_MODEL(MODLINES,DIREC,XCEN,YCEN,CORNMOD);
32900		INCHWL; INCHWL;
33000	
33100	
33200		OUTSTR(" DO YOU WANT TO SEE THE COORDINATES OF THE CORNERS?
33300				Y OR N  "ACRLF);
33400		IF INCHWL="Y" THEN
33500		BEGIN
33600		SHORT INTEGER NCEN,NCT2,ZOR4,N,K;
33700			NCORNERS←ABS(DIR_EYE[0,1]);
33800			FOR N←1 STEP 1 UNTIL NCORNERS DO
33900			BEGIN "CYC"
34000			NCEN←NCT2←2*(N-1);
34100			IF MODLINES=1 THEN NCT2←N-1;
34200			IF MODLINES=1 THEN 
34300			OUTSTR("X-CENTER AT "&CVG(DIR_EYE[N-1,2])&
34400			   ",   Y-CEMTER AT "&CVG(DIR_EYE[N-1,3])ACRLF)
34500			ELSE OUTSTR("X-VERTEX AT "&CVG(DIR_EYE[NCT2,2])&
34600			   ",   Y-VERTEX AT "&CVG(DIR_EYE[NCT2,3])ACRLF);
34700			FOR K←1 STEP 1 UNTIL MODLINES DO
34800			BEGIN
34900				IF K=2 THEN 
35000				BEGIN 
35100					ZOR4←0;
35200					NCT2←NCT2+1;
35300				END
35400				ELSE ZOR4←4;
35500	OUTSTR("TH-VALUE(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+1])ACRLF);
35600	OUTSTR("C-VALUE(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+2])ACRLF);
35700	OUTSTR(	"  SIN(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+3])ACRLF);
35800	OUTSTR(	"  COS(LINE "&CVS(K)&") = "&CVG(DIR_EYE[NCT2,ZOR4+4])ACRLF);
35850			END;
35900			END "CYC";
36000		END;
36100	
36200	
36300	
36400	PAR:
36500	   OUTSTR("DO YOU WANT TO CHANGE THE THREE WAL PARAMETERS? --- Y OR N"ACRLF);
36600		COMMENT   NOTICE THAT THE INPUT STRING IS ONLY COMPARED
36700		    WITH "Y".  IF IT IS A "Y" (OR STARTS WITH A "Y" --- CHECK
36800		    THE SAIL MANUAL FOR THE DETAILS OF STRING COMPARISONS ---
36900		    BASICALLY THE "=" COMPARISON ONLY COMPARES THE FIRST 
37000		    CHARACTERS.  THERE IS A BUILT-IN FUNCTION EQUAL(...)
37100		    WHICH COMPARES THE COMPLETE STRINGS.),  THE JUMP TO LOOP
37200		    WILL BE TAKEN.  IF THE INPUT STRING IS ANYTHING ELSE
37300		    (EVEN JUST A CARRIAGE-RETURN) THE JUMP WILL NOT BE TAKEN.
37400	
37500		    WARNING:   SOMETIMES THE OUTPUT MESSAGES (LIKE THE ONE
37600		    PRODUCED BY THE STATEMENT ABOVE) ARE INTERSPERSED WITH 
37700		    THE HAND/EYE TRACING INFORMATION.  IF EVERYTHING COMES
37800		    TO A HALT, LOOK THROUGH THE LAST FEW LINES OF THE TRACE
37900		    OUTPUT TO SEE IF ONE OF THE PROGRAM-PRODUCED QUESTIONS
38000		    OR REMARKS IS EMBEDDED THERE.;
38100	
38200	    IF INCHWL="Y" THEN GO TO PARMS;
38300	    OUTSTR("DO YOU WANT TO CHANGE THE MODEL? --- Y OR N"ACRLF);
38400	    IF INCHWL="Y" THEN GO TO LOOP1;
38500	OUTSTR(" DO YOU WANT TO CHANGE THE CAMERA POSITION? --- Y OR N "ACRLF);
38600		IF INCHWL≠"N" THEN GO TO LOOP;
38700	
38800	
38900	END "CORNFIT";
39000	
39100	
39200	CORNFIT;
39300	
39400	
39500	
39600	END "WALDRV";